home *** CD-ROM | disk | FTP | other *** search
- IF NOT lasm
- .printx * CPXSYS.ASM *
- ENDIF ;NOT lasm
- ; KERMIT - (Celtic for "FREE")
- ;
- ; This is the CP/M-80 implementation of the Columbia University
- ; KERMIT file transfer protocol.
- ;
- ; Version 4.0
- ;
- ; Copyright June 1981,1982,1983,1984,1985
- ; Columbia University
- ;
- ; Originally written by Bill Catchings of the Columbia University Center for
- ; Computing Activities, 612 W. 115th St., New York, NY 10025.
- ;
- ; Contributions by Frank da Cruz, Daphne Tzoar, Bernie Eiben,
- ; Bruce Tanner, Nick Bush, Greg Small, Kimmo Laaksonen, Jeff Damens, and many
- ; others.
- ;
- ; This file contains the system-dependent code and data for KERMIT.
- ; It will be probably be broken into independent files to generate
- ; overlays for the various systems, one or more overlay possible
- ; from each file. For now, we will leave it in one piece.
- ;
- ; revision history:
- ;
- ;
- ; Edit 40, 28-Aug-89 by Mike Freeman of Bonneville Power Administration,
- ; P.O. Box 491, Vancouver WA 98666 USA, Telephone (206)690-2307:
- ; Home address: 301 N.E. 107th Street; Vancouver, WA 98685 USA
- ; Home telephone: (206)574-8221
- ; added support for Hewlett-Packard HP-125 Business Assistant computer
- ; running a HP-modified CP/M Version 2.2; communications on
- ; DAta Comm 1 or Data Comm 2 (8th-bit quoting must be used on
- ; Data Comm 2 to transfer binary files as Data Comm 2 only supports
- ; a 7-bit data path); printer cannot be used with communications on
- ; Data Comm 2 (the printer port).
- ; edit 39, 4 August, 1987b by OBSchou for Charles Lasner re. DECMATE II
- ; fixes to set xon/off control off for the duration of Kermit-80.
- ;
- ; His header reads:
- ;
- ; IBM mode restore program
- ;
- ; This routine must be run after using CP4DMF (and KERMIT-80) to restore
- ; the normal handling of XON/XOFF; the user may also elect to cold-boot
- ; the DECMATE instead.
- ;
- ; acknowledgments and limitations.
- ;
- ; This program is based on DECMATE specific implementation details
- ; provided by Walt Lamia of DEC. It is of course, specific to DECMATE
- ; implementations of CP/M-80 for DECMATE II, III, III-plus, etc.
- ;
- ; usage consists of merely:
- ;
- ; CP4DMF run xon/xoff disable program
- ; KERMIT80 then run kermit
- ; <KERMIT-80 commands used normally here, including SET IBM ON>
- ; CP4DMU run this program to restore normal XON
- ;
- ; unless CP4DMU is run following KERMIT-80, the normal handling of
- ; XON/XOFF provided by KERMIT-80 will not work (cold boot is another
- ; alternative).
- ;
- ; [Note - These edits now included in the init/de-init code]
- ;
- ; edit 38, 23 July, 1987 by OBSchou. Moved out commonly used code
- ; to CPXCOM.ASM, and adjusted this (ond other family) files accordingly.
- ; Also filtered out code now in other family files.
- ;
- ; edit 37 , 15 July 1987 by OBSchou for David Moore, who has submitted
- ; code for Teletek SYSTEMASTER (teletek) and for an ADM 22 terminal.
- ;
- ; edit 36 28 Jan 87 by OBSchou.
- ; Removed the printx etc and should only have this file if a system
- ; does not have a family file.
- ;
- ; edit 35 1st Dec 1986 by OBSchou. Added test for Amstrad PCW range (PCW)
- ; Links to CPXPCW.ASM, which was submitted by Ian Young, Lattice
- ; Logic Systems.
- ;
- ; edit 34 20 August by OBSchou for Brian Robertson, Aberdeen University:
- ; I have discovered a bug in my code for the BBC/Z80 version of Kermit.
- ; At startup the transmitter baud rate is read from the serial ULA.
- ; The TX and RX baud rates are then reset to this value and the
- ; value is stored in location 'baud:' for the STATUS (or SHOW)
- ; command. That is how it is supposed to work ! Unfortunately
- ; my code at present "misreads" the initial TX baud rate - there
- ; is some bit manipulation that needs to be done to extract the
- ; correct value.
- ;
- ; edit 33 30-May-86 OBSchou. Added two new enties to the overly. One for
- ; printer status and the other for the address of the family of
- ; computer using the overlay. If it is still in CPXSYS.ASM then it
- ; is a dollar only.
- ;
- ;edit 32, 27 May, 1986 by OBSchou Loughborough University for
- ; B Robertson, Aberdeen Univ. Computing Centre. Any mistakes my fault.
- ; Add support for APPLE II with serial cards based on the 6850 ACIA.
- ; Mod 380Z support to allow both MDS (5 1/4" discs) and FDS (8" discs)
- ; configurations.
- ;
- ; edit 31, 22 April, 1986, OBSchou.
- ; Kermit version 4.06 starts here. All previous edits have been
- ; put aside (leave in a BWR file?). Hived off some definitions
- ; to the CPSDEF.ASM file as that is where they belong.
- ; Start on splitting off individual
- ; systems from this huge file. It is done using the LINK facility
- ; LASM. We link to a collection of systems under CPXxxx.ASM.
- ; I have started with the systems I know, the Torch, Cifer and
- ; pci2651. These will all be held under CPXTOR.ASM
- ;
- ;
- ; Keep module name, edit number, and last revision date in memory.
- family: db 'CPXSYS.ASM (40) 28-Aug-89 $' ; now a family...
- ;
-
-
- ; Processor speed in units of 100KHz
- ; for cpt85xx, advance, apple,bbc,px8 & rm380z timing loop [12]
- IF rm380z
- cpuspd SET 40 ; 4.0 MHz CPU
- ENDIF; rm380z
-
- IF disc OR mmate OR s1008 OR access
- cpuspd SET 40 ; 4.0 MHz CPU
- ENDIF ;disc OR mmate OR s1008 OR access
-
- IF bbc ;[9]
- cpuspd SET 60 ; BBC with 6Mhz Z80
- ENDIF;bbc
-
-
- ; the basics...
-
- IF gener
- batio EQU 056H ;I/O byte CON=BAT,LIST=CRT,READER=RDR,PUNCH=PTP
- defio EQU 095H ;I/O byte CON=CRT,LIST=LPT,READER=RDR,PUNCH=PTP
- crtio equ 01010101B ; use CRT: device
- ptrio equ 01010110B ; use PTR: device
- ttyio equ 00000000B ; use TTY: device
- uc1io equ 01010111B ; use UC1: device
- ur1io equ 01101010B ; use UR1: device
- ur2io equ 01111110B ; use UR2: device
- ENDIF;gener
-
- IF robin
- batio EQU 056H ;I/O byte CON=BAT,LIST=CRT,READER=RDR,PUNCH=PTP
- defio EQU 095H ;I/O byte CON=CRT,LIST=LPT,READER=RDR,PUNCH=PTP
- lptio EQU 054H ;I/O byte CON=TTY,LIST=CRT,READER=PTR,PUNCH=PTP
- gppio EQU 057H ;I/O byte CON=UC1,LIST=CRT,READER=RDR,PUNCH=PTP
- ENDIF;robin
-
-
- IF dmII OR bbc ;[22]
- batio EQU 042H ;I/O byte CON=BAT,LIST=CRT,READER=RDR
- defio EQU 081H ;I/O byte CON=CRT,LIST=LPT,READER=RDR
- ENDIF;dmII
-
- IF mikko
- batio EQU 10110010B ; I/O byte console => serial line
- defio EQU 10000001B ; I/O byte console => CRT and Keyboard
- ENDIF;mikko
- ;
- IF lobo ;[hh]
- mnport EQU 0F7E4H ;Modem data port A
- mnprts EQU 0F7E5H ;Modem status/conrtol port A
- baudrt EQU 0F7D0H ;Baud rate port A
- output EQU 04H ;Transmit buffer empty
- input EQU 01H ;Receive data available
- z80 SET TRUE ;a good z80, here
- ENDIF;lobo
-
- IF osi
- mnport EQU 0CF01H ;Modem data port
- mnprts EQU 0CF00H ;Modem status port
- output EQU 02H ;Transmitter empty
- input EQU 01H ;Input data available
- z80 SET FALSE ;I don't know...
- ENDIF;osi
-
- IF vector
- mnport EQU 04H ;Modem data port
- mnprts EQU 05H ;Modem status port
- output EQU 01H ;Transmitter empty
- input EQU 02H ;Input data available
- z80 SET FALSE ;I don't know...
- ENDIF;vector
-
- IF delphi ;[7]
- mnport EQU 22H ;[7] Modem data port
- mnprts EQU 23H ;[7] Modem status port
- output EQU 01H ;[7] Transmitter empty
- input EQU 02H ;[7] Input data available
- baudrt equ 29h ;[7] Baud rate port for channel 2 (default)
- z80 SET true ;[7] We're using the z80 side of the dual processor
- ENDIF;[7] delphi
-
- IF trs80
- ;NEEDS display definition (e.g. trs80lb or trs80pt)
- mnport EQU 0F4H ;Modem data port (0F5H for port B)
- mnprts EQU 0F6H ;Modem status port (0F7H for port B)
- output EQU 04H ;Transmitter empty
- input EQU 01H ;Input data available
- z80 SET TRUE ;[hh] All TRS-80's but the CoCo
- ENDIF;trs80
-
- IF teletek
- mnport EQU 00H ;Modem data port (02 for port B (console))
- mnprts EQU 01H ;Modem status port (03 for port B (console))
- baudrt EQU 08H ;ctc0 control port (09 for port B (console))
- output EQU 04H ;Transmitter empty
- input EQU 01H ;Input data available
- z80 SET TRUE ;All Teleteks
- ENDIF;teletek
-
- IF osbrn1
- ;Osborne 1 uses 6850 ACIA, but memory mapped. Derived from Apple.
- BAUDRT EQU 0EFC1H ;Memory location where baud rates are stored.
- OSTOP EQU 4000H ;Where we move OSMOVE to at startup
- OSPORT EQU 2A01H ;Communications Port.
- OSPRTS EQU 2A00H ;Communications Port Status.
- OUTPUT EQU 02H ;Output Buffer Empty.
- INPUT EQU 01H ;Input Register Full.
- OSBIN1 EQU 57H ;First Init Character for 6850 ACIA (Reset)
- ;(I would have thought 03, but prom code writes 57 there)
- OSBI12 EQU 55H ;Second Init Character for ACIA (8-bits, 1200)
- OSBI03 EQU 56H ;Second init char. for ACIA (8 bits, 300)
- ;(don't ask.. I don't know why SETUP writes 55 and 56 either)
- z80 SET TRUE ;[hh] a z80 here, also
- ENDIF;osbrn1
-
- IF robin
- ;Those definitions below that are commented out are just for information
- ;***** NOT generally found in distributed documentation ****
-
- ;pbausl EQU 90H ;The Baud-Rate register.
- prntst EQU 49H ;Printer
- ;prndat EQU 48H
- contst EQU 41H ;Console
- ;condat EQU 40H
- gentst EQU 51H ;General port.
- ;gendat EQU 50H
- comtst EQU 59H ;COMM-Port
- ;comdat EQU 58H
- ;output EQU 01H ;Output ready bit.
- ;input EQU 02H ;Input ready bit.
- z80 SET TRUE ; This one's a Z80.
- ENDIF;robin
-
- IF s1008 ;[29]
- mnport equ 00 ;printer port data
- mnprts equ 01 ;printer port status
- output equ 4 ;transmitter ready
- input equ 2 ;receiver ready
- z80 equ FALSE ;not important
- ENDIF;s1008 [29]
-
- IF mmate ;[29]
- mnport EQU 89H ;MODEM data port
- mnprts EQU 8BH ;MODEM status/control port
- output EQU 04H ;Transmit buffer empty, ready to send
- input EQU 01H ;Receive data available
- baudrt EQU 93H ;MODEM baud rate port
- ;NOTE - also used for console
- z80 SET TRUE
- ENDIF;mmate [29]
-
- IF disc ;[29]
- mnport EQU 05 ;Discovery 83U port B data
- mnprts EQU 04 ;Discovery 83U port B status/command
- output EQU 04 ;Transmit buffer empty
- input EQU 01 ;Receiver ready
- z80 SET TRUE
- ENDIF;disc [29]
-
- IF cmemco ;[25]
- tuart EQU 020H ;TU-ART address
- mnport EQU tuart+1 ;Modem data port
- mnprts EQU tuart ;Modem status port
- output EQU 080H ;Transmitter empty
- input EQU 040H ;Input data available
- baudrt EQU tuart ;Baud rate port
- ;Note: Needs terminal definition
- z80 SET TRUE ;This one's a Z80.
- ENDIF;cmemco
-
- IF cpt85xx
- baudrt EQU 4Ch ; Baud rate generater (National MM5307)
- mnport EQU 4Bh ; Comm port data register (Intel 8251)
- mnprts EQU 4Ah ; Comm port command/status register
- output EQU 01h ; Transmitter buffer empty flag
- input EQU 02h ; Reciver buffer full flag
- TxEmpty EQU 04h ; Transmitter empty flag
- z80 SET FALSE ; It's really an 8080 [or 8085 ... same thing]
- ENDIF;cpt85xx
-
- IF mmdI ;Morrow MicroDecision - the single-board one
- mnport EQU 0FEH ;Morrow Printer UART data port
- mnprts EQU 0FFH ;Morrow Printer UART command/status
- output EQU 01H ;Output ready bit.
- input EQU 02H ;Input ready bit.
- ;Note: Needs terminal definition
- z80 SET FALSE ;I don't know...
- ENDIF;mmdI
-
- IF bbc ;[22]
- osbyte EQU 0FFF4H ; OS entry point
- osword EQU 0FFF1H ; " " "
- term EQU 0FFC8H ;Terminal mode OS entry
- z80 SET TRUE
- ENDIF;[22] bbc
-
- ;Two types of 380Z system
- IF rm380zm ;[27] MDS - 5 1/4" discs
- mnport EQU 0C8H ;Modem data port
- mnprts EQU 0C9H ;Modem status port
- ENDIF;[32] rm380zm
-
- IF rm380zf ;[32] FDS - 8" discs
- mnport EQU 0E8H ;Modem data port
- mnprts EQU 0E9H ;Modem status port
- ENDIF;[32] rm380zf
-
- IF rm380z ;[32] Common to both systems
- output EQU 01H ;Transmitter buffer empty
- input EQU 02H ;Input data available
- TxEmpty EQU 04h ;Transmitter empty flag
- z80 SET TRUE
- ENDIF;[22] rm380z
-
- IF px8 ; [29]
- z80 SET TRUE
- mnprts EQU 0dh ; used in sending a break
- ENDIF ;px8 [29]
-
- IF mdI ;Morrow Decision I - the big sucker
- mnport equ 48H ; Modem data port.
- mnprts equ 4DH ; Modem status port.
- output equ 20H ; Transmitter empty.
- input equ 1 ; Input data available.
- mbase equ 48H ; Base address of Multi I/O port
- ; selector area.
- grpsel equ 4FH ; Group select port.
- rbr equ 48H ; Read Data Buffer.
- group equ 1 ; Multi I/O Group byte for serial ports.
- congrp equ 1 ; Serial Port 1 for console
- mdmgrp equ 3 ; Serial Port 3 for modem.
-
- ; Following are needed for baud rate changes...[Toad Hall]
-
- dlm equ 49H ; Baud Rate Divisor (Most Sig Bit)
- dll equ 48H ; Baud Rate Divisor (Least Sig Bit)
- ier equ 49H ; Interrupt Enable Register
- lcr equ 4BH ; Line Control Register
- lsr equ 4DH ; Line Status Register
- msr equ 4EH ; Modem Status Register
- dlab equ 80H ; Divisor Latch Access Bit
- wls0 equ 1 ; Word Length Select Bit 0
- wls1 equ 2 ; Word Length Select Bit 1 for 8 bit word
- stb equ 4 ; Stop bit count - 2 stop bits
- imask equ 0 ; Interrupt mask (all disabled)
- z80 SET TRUE ; This one's a Z80.
- ENDIF ;mdI NOTE: needs terminal definition. [Toad Hall]
-
- IF mikko
- sioac EQU 0FF12H ;SIO channel A register(s) address
- sioo3 EQU 01000001B ;SIO Write Reg. 3 original setup (?)
- ;RX 7 bits,synch mode bits 0,RX enable
- sion3 EQU 11001111B ;SIO Write Reg. 3 KERMIT setup
- ;RX 8 bits,synch mode bits 0,RX enable
- sioo4 EQU 01001111B ;SIO Write Reg. 4 original setup (?)
- ;X16 clock,8 bit synch(ignored),
- ;2stop bits,par even(on)
- sion4 EQU 01000100B ;SIO Write Reg. 4 KERMIT setup
- ;X16 clock,8 bit synch(ignored),
- ;1stop bit,par off
- sioo5 EQU 10101010B ;SIO Write Reg. 5 original setup (?)
- ;DTR,TX 7 bits,TX enable,RTS
- sion5 EQU 11101010B ;SIO Write Reg. 5 KERMIT setup
- ;DTR,TX 8 bits,TX enable,RTS
- txclk EQU 0FF30H ;Baud rate generator (CTC) for transmitter
- rxclk EQU 0FF31H ;Baud rate generator (CTC) for receiver
- chmask EQU 0F1F2H ;Mask byte address for SIO ch. A reception
- z80 SET TRUE ;It's got a SIO and a CTC, it must be a Z80
- ENDIF;mikko
-
-
- IF access ;[29]
- mnport EQU 40H ;Modem data port A
- mnprts EQU 42H ;Modem status/conrtol port A
- output EQU 04H ;Transmit buffer empty
- input EQU 01H ;Receive data available
- z80 SET TRUE ;a good z80, here
- ENDIF;access [29]
-
-
- IF robin OR dmII
- z80 SET TRUE ; This one's a Z80
- ENDIF;robin OR dmII
-
- IF hp125 ;[MF]
- z80 SET TRUE ;HP-125 uses a Z80
- ENDIF;hp125 [MF]
-
- IF gener OR cpm3 ; To be truly generic, we must assume 8080.
- z80 SET FALSE
- ENDIF;gener OR cpm3
- ;
- IF osi
- defesc EQU ']'-100O ;The default escape character.
- ENDIF; osi
-
- IF vector
- defesc EQU '~' ;Vector can't type ']'.
- ENDIF;vector
-
- IF mikko OR osbrn1 OR lobo
- defesc EQU '\'-100O ;The default is Control \ -- it's easier B.E.
- ENDIF;mikko OR osbrn1 OR lobo
-
- IF cpt85xx
- defesc EQU '\'-100O ;Still Control-\ (just ran out of room...)
- ENDIF;cpt85xx
-
- IF bbc OR rm380z OR px8 OR access OR S1008 ;[22] [29]
- defesc EQU '\'-100O ;Still Control-\ (just ran out of room...)
- ENDIF ;bbc OR rm380z OR px8 OR access OR s1008[29]
-
- IF trs80
- defesc EQU '_'-100O ;CTRL-_ (Down-arrow on TRS-80 keyboard)
- ENDIF;trs80
-
- ; Select initial setting for VT-52 emulation flag.
-
- IF vt52 ; If console looks like (or is) VT52
- vtval EQU 0 ; we don't need VT52 emulation
- ENDIF;vt52
-
- ; If none of the above, default to VT52-EMULATION ON.
- IF NOT (crt OR vt52 OR robin OR dmII OR vt100 OR hp125);[MF]
- vtval EQU 1
- ENDIF;NOT (crt OR vt52 OR robin OR dmII OR vt100 OR hp125)[MF]
-
-
- ; sysxin - system dependent initialisation code, called from SYSINIT
- ;
- sysxin:
-
- IF dmII
- ; edit added by OBSchou for C. Lasner. If this dont work, tell me whats
- ; wrong, as I have no DMII or IBM to play with
- ;
- ; IBM mode fixup program
- ;
- ; This routine must be run before attempting to use KERMIT-80 with half
- ; duplex KERMIT implementations such as CMS-KERMIT, as the 6120 processor
- ; will otherwise "swallow" the XON character.
- ;
- ; acknowledgments and limitations.
- ;
- ; This program is based on DECMATE specific implementation details
- ; provided by Walt Lamia of DEC. It is of course, specific to DECMATE
- ; implementations of CP/M-80 for DECMATE II, III, III-plus, etc.
- ;
- ; usage consists of merely:
- ;
- ; CP4DMF run this program
- ; KERMIT80 then run kermit
- ; <KERMIT-80 commands used normally here, including SET IBM ON>
- ; CP4DMU run companion program to restore normal XON
- ;
- ; unless CP4DMU is run following KERMIT-80, the normal handling of
- ; XON/XOFF provided by KERMIT-80 will not work (cold boot is another
- ; alternative).
- ;
- ; CP4DMF.ASM
- ;
- ; last edit: 12-jun-87 20:00:00 Charles J. Lasner (CJL)
-
- ;oboff equ 3fh ; offset of outbyt routine for 6120
- ;prtctl equ 02h ; port control
- nocoxon equ 001h ; turn off comm. output XON
-
- lxi b,(nocoxon * 100h) + prtctl ; c/prtctl, b/no out. xon
- call outbyt
- ret ; and return
-
- ;outbyt has been catered for (in break routine)
- ENDIF ;dmII
-
- IF osbrn1 ;(Note now no longer needs code > 4000h as it is already there
- ; lxi d,ostop ;where we're moving it to
- ; lxi h,osmove ;what we're moving
- ; mvi b,osmct ;How many bytes we're moving
- ; call mover
- lda baudrt ; Find out what speed is current
- ani 1
- mvi a,osbi03 ; assume 300 baud
- jz osstr1
- mvi a,osbi12 ; nope, it's 1200.
- osstr1: sta speed ; save initial speed
- sta speed+1 ; as 16 bits, to match speed table entries
- mov d,a
- mov e,a ; get initial speed in DE
- call sysspd ;set up parity etc.
- ENDIF;osbrn1
-
- IF cpt85xx
- mvi a,80h ; Send UART reset [force idle] by setting
- out baudrt ; bit 7 of baud rate I/O port
- lxi H,0f0fh ; Clear reset and default to 9600 baud [23]
- shld speed ; store current speed
- xchg
- call sysspd ; set default baud rate
- mvi a,4Eh ; Set UART mode to async 16x clock, 8 data
- out mnprts ; bits, no parity, and 1 stop bit
- mvi a,37h ; Set command to Tx enable, DTR on, Rx enable,
- out mnprts ; break off, error reset, and RTS on
- ENDIF ; cpt85x
-
- IF bbc ;[22]
- lxi d,modstr ; Set MODE 3
- call prtstr
- mvi a,1 ; Set terminal mode on
- call term
- mvi a,0F2H ; Read current transmit speed
- lxi h,0FF00H ; .. 3 lsb of ULA register
- call osbyte ; FX242,0,255
- mov a,l
- ani 7 ; Mask of 3 lsb
- ;
- ; Edit of July 22, 1986 by B Robertson, Aberdeen Univ. Computing Centre.
- ; Correct bug in sysinit for BBC - reads the initial baud rate at
- ; start up incorrectly.
- ;
- ;
- rar ; Reverse order of 3 lsb
- rar ; Bit2 now in bit0
- jnc binit1 ;
- ori 2 ; Restore bit1
- binit1: ana a ; Set sign bit as appropriate
- jp binit2 ;
- ori 4 ; Bit0 now in bit2
- binit2: ani 7 ; Mask off unwanted bits
- ; End of Edit
-
- xri 7 ; Stored as 2's complement
- inr a
- sta speed ; Store 16 bit value
- sta speed+1
- mov e,a ; Ensure RX and TX speeds are the same
- call sysspd
- ENDIF;[22] bbc
-
- IF rm380z ;[22]
- mvi e,11h ;Output ctrl-Q to clear autopaging
- call outcon
- ENDIF;[22] rm380z
-
-
- IF lobo ;[hh]
- lxi d,siotbl ;[hh] address of status table
- mvi c,siolen ;[hh] length of the table
- siolup: ;[hh] loop here for each command byte
- ldax d ;[hh] load first byte into A
- inx d ;[hh] index pointer to next bute
- sta mnprts ;[hh] send it to status port A
- sta mnprts+2 ;[hh] and to status port B
- dcr c ;[hh] decrement the counter
- jnz siolup ;[hh] loop back for more commands
- mvi a,05H ;[hh] value for 300 baud
- sta baudrt ;[hh] starting default for port A
- sta baudrt+4 ;[hh] and for port B
- sta speed ;[hh] tell program they're set
- mvi a,0E4H ;[hh] value for port A
- sta port ;[hh] tell program we've set this, too
- mvi a,0D0H ;[hh] port A baud rate value
- sta port+1 ;[hh] save this as well, for consistancy
- ENDIF ;lobo
-
- IF mikko
- lxi d,mintbl ;Address of KERMIT Reg values (what)
- mvi c,minlen ;Length of table (how many)
- lxi h,sioac ;Send data to ch. A SIO registers (to where)
- call movmik
- mvi a,0FFH ;Set ch. A mask to use all bits
- sta chmask
- ENDIF;mikko
-
- IF mdI
- lxi h,96 ;Default 1200 baud modem port speed
- shld speed ;Store as modem port speed
- call sysspd ;Initialize the port
- ENDIF;mdI [Toad Hall]
-
- IF cmemco ;[25]
- mvi a,01h ; Reset TU-ART
- out tuart+2
- mvi a,90h ; Set default baud rate (2400), and 1 stop bit
- out tuart
- sta speed ; save for status display
- sta speed+1
- ENDIF;cmemco
-
- IF delphi ;[7]
- ;
- ; shove the default baud rate (1200) in to the Delphi port address
- ; for the baud rate generator on port 2, the default port; save this
- ; value so we can tell what speed is selected.
- ;
- mvi a,07h ;[7] get value for 1200 baud
- out baudrt ;[7] set it for port 2
- sta speed ;[7] save for status display
- sta speed+1
- ENDIF;[7] delphi
-
- IF px8 ; [29]
- lda 0f6a9h ; get baud rate value set by CONFIG
- sta px8blk+4 ; put into parameter block
- mov h, a ; initialise global speed indicator
- mov l, a
- shld speed
- lhld 6 ; base of CP/M
- ; buffer starts at ovlend+8192, immediately after sector buffer
- ; We must also allow (800h) for the CCP as Kermit exits with a RET
- lxi d, ovlend+8192+800h ; calc buffer length
- ora a ; clear carry
- db 0edh, 52h ; sbc hl, de
- shld px8blk+2
- call rsopen
- ENDIF ; px8 [29]
-
- IF disc ;[29]
- ;Initialization sequence for Discovery 83U port B
- ;Sets port to 9600 baud, 8 data bits, 1 stop bit, no parity
- mvi a,12 ;Register 12
- out mnprts
- mvi a,11 ;Low byte of time constant for 9600
- out mnprts
- mvi a,13 ;Register 13
- out mnprts
- mvi a,0 ;High byte of time constant for 9600
- out mnprts
- mvi a,14 ;Register 14
- out mnprts
- mvi a,3 ;Enable baud rate generator
- out mnprts
- mvi a,11 ;Register 11
- out mnprts
- mvi a,52h ;No Xtal, tclk=rclk=/trxc out=br gen
- out mnprts
- mvi a,4 ;Register 4
- out mnprts
- mvi a,44h ;16x clock, 1 stop, no parity
- out mnprts
- mvi a,3 ;Register 3
- out mnprts
- mvi a,71h ;rx 8 bit/ch, autoenable, rx enable
- out mnprts
- mvi a,5 ;Register 5
- out mnprts
- mvi a,0eah ;tx 8 bit/ch, tx enable, rts
- out mnprts
- ENDIF;disc [29]
- ;
- ;
- IF mikko ;currently for MIKROMIKKO only
- ; copy command block into memory-mapped SIO.
- movmik: di ;disable interrupts
- movmk1: ldax d ;Get a register value
- mov m,a ;Output it
- inx d ;Next value
- dcr c ;Decrement counter
- jnz movmk1 ;Repeat until done
- ei
- ret
- ENDIF;mikko
-
- ;
- IF osbrn1
- osmove:
- osflag equ 0EF08H ;Osborne 1 Bank-2 flag
- ;
- ; return modem status in A
- ;
- OSLDST:
- DI
- OUT 0
- LDA osprts ;Read the status port
- OUT 1
- EI
- ret
- ;
- ; set modem status from A
- ;
- OSSTST:
- DI
- OUT 0
- STA osprts ;Write the control port
- jmp osstex
- ;
- ; read character from modem into A
- ;
- OSLDDA:
- DI
- OUT 0
- LDA osport
- OUT 1
- EI
- ret
- ;
- ; output character in A to modem
- ;
- OSSTDA:
- DI
- OUT 0
- STA osport
- osstex:
- OUT 1
- mvi a,1
- sta osflag
- EI
- ret
- ENDIF;osbrn1
-
- IF lobo
- ; List of commands to set up SIO channel A for asynchronous operation.
- siotbl: DB 18H ; Channel reset
- DB 18H ; another, in case register 0 wasn't selected
- DB 04H ; Select register 4
- DB 44H ; 1 stop bit, clock*16
- DB 01H ; Select register 1
- DB 00H ; No interrupts enabled
- DB 03H ; Select register 3
- DB 0C1H ; Rx enable, 8 bit Rx character
- DB 05H ; Select register 5
- DB 0EAH ; Tx enable, 8 bit Tx character,
- ; raise DTR and RTS
- siolen equ $-siotbl ; length of command list
- ENDIF;lobo
-
- IF mikko
- ; command list to set SIO chip back to normal state
- miotbl: db 3 ;reg. 3
- db sioo3
- db 5 ;reg. 5
- db sioo5
- db 4 ;reg. 4
- db sioo4
- db 0 ;reselect reg. 0
- miolen equ $-miotbl ;MikroMikko SIO table length (original values)
-
- ; command list to set up SIO chip for operation with Kermit
- mintbl: db 3 ;reg. 3
- db sion3
- db 5 ;reg. 5
- db sion5
- db 4 ;reg. 4
- db sion4
- db 0 ;reselect reg. 0
- minlen equ $-mintbl ;MikroMikko SIO table length (KERMIT values)
- ENDIF;mikko
-
-
- IF bbc ;[22]
- modstr: db 16h,03h,'$' ; String to put screen into MODE 3
- ENDIF
-
- IF px8 ; [29]
- rsget: mvi b, 50h
- jmp rsiox
- rsinst: mvi b, 30h
- jmp rsiox
- rsput: mvi b, 60h
- jmp rsiox
- rsoutst:mvi b, 40h
- jmp rsiox
- rserst: mvi b, 90h
- jmp rsiox
- rsopen: lxi h, px8blk ; copy px8blk to px8prm
- lxi d, px8prm
- lxi b, 9
- call mover
- mvi b, 10h ; open code
- jmp rsiox
- rsclose:mvi b, 20h ; close code
- rsiox: lxi h, px8prm
- lxi d, 51h ; offset into BIOS jump table
- push h
- lhld 1 ; start of BIOS
- dad d
- xthl ; entry point on stack, px8prm addr in hl
- ret ; jump indirect
-
- px8prm: dw 0, 0
- db 0, 0, 0, 0, 0 ; the param area is overwritten in rsopen
- px8blk: dw ovlend+8192 ; buffer address
- dw 0 ; buffer size - overwritten
- db 0 ; baud rate - overwritten
- db 3 ; 8 bits/char
- db 0 ; no parity, it is done internally
- db 1 ; 1 stop bit
- db 0cfh ; special bits - activate xon/xoff
- ; The documentation suggests that the xon/xoff bit is bit 4, i.e the pattern
- ; should be 0efh, but the top bit is omitted from the diagram. I will try
- ; clearing both bit 4 and bit 5.
- ENDIF ; px8 [29]
-
- IF hp125 ;[MF]
- lxi b,73ffh ;Prepare Data Comm 1 to
- call bdos ;Transfer eight-bit data
- lxi d,jbuf ;Point to bios jump-table vector
- lxi b,7effh ;Set up special subfunction code to
- call bdos ;Get rdr routine address
- lhld jbuf+3 ;Remember this address
- shld readin+1 ;for our eight-bit rdr routine
- mvi a,1 ;We want to write into the bios jump table
- sta jbuf+1 ;...
- lxi h,readin ;Point to our rdr routine (all 8 bits)
- shld jbuf+3 ;as new RDR routine
- lxi d,jbuf ;Point to jump vector argument block
- lxi b,7effh ;Set subfunction code to
- call bdos ;Substitute our rdr routine in dispatch table
- lxi h,mapon1 ;Make Data Comm 1 the default port
- shld port ;at program-start
- xchg ;Put in DE
- call prtstr ;Print escape sequences to connect
- ;DAta Comm 1 to rdr/punch
- ENDIF ;hp125 [MF]
-
- ret ; end of sysxin
-
- ;
- ; system-dependent termination processing
- ; If we've changed anything, this is our last chance to put it back.
- sysexit:
-
- IF dmII
- ; Edited by OBSchou for Charles Lasner. His bug fix now in Kermit-80:
- ;
- ; IBM mode restore program
- ;
- ; This routine must be run after using CP4DMF (and KERMIT-80) to restore
- ; the normal handling of XON/XOFF; the user may also elect to cold-boot
- ; the DECMATE instead.
- ;
- ; acknowledgments and limitations.
- ;
- ; This program is based on DECMATE specific implementation details
- ; provided by Walt Lamia of DEC. It is of course, specific to DECMATE
- ; implementations of CP/M-80 for DECMATE II, III, III-plus, etc.
- ;
- ; usage consists of merely:
- ;
- ; CP4DMF run xon/xoff disable program
- ; KERMIT80 then run kermit
- ; <KERMIT-80 commands used normally here, including SET IBM ON>
- ; CP4DMU run this program to restore normal XON
- ;
- ; unless CP4DMU is run following KERMIT-80, the normal handling of
- ; XON/XOFF provided by KERMIT-80 will not work (cold boot is another
- ; alternative).
- ;
- ; CP4DMF.ASM
- ;
- ; last edit: 12-jun-87 20:00:00 Charles J. Lasner (CJL)
- ;
- coxon equ 000h ; enable comm. output XON
- ;oboff equ 3fh ; offset of outbyt routine for 6120
- ;prtctl equ 02h ; port control
-
-
- lxi b,(coxon * 100h) + prtctl ; c/prtctl, b/with out. xon
- call outbyt ;[OBS] declared elswhere
- ret ; and return
-
- ENDIF ;dmII
-
- IF mikko
- lxi d,miotbl ;Load the adress of original reg values
- mvi c,miolen ;Length of table
- lxi h,sioac ;Send data to ch A SIO registers
- call movmik
- mvi a,07FH ;Set ch A mask to use just 7 bits
- sta chmask
- ENDIF;mikko
-
- IF teletek
- ;Note - This code was handwritten onto the lising I was sent, with the
- ; comment that David had just thought of the code, so it was
- ; not on the listing. If you have problems I suggest you
- ; comment out these few lines.
- ;Bertil Schou.
- ;
- di
- mvi a,47h ; reset baud rate to 9600
- out baudrt
- mvi a,08h
- out baudrt
- ei
- ENDIF ;teletek
-
- IF cpt85xx
- mvi a,80h ; Reset (force idle) the 8251 UART via bit 7
- out baudrt ; of the baud rate generater port
- mvi a,00h ; and turn off the baud rate generater
- out baudrt
- ENDIF;cpt85xx
-
- IF bbc ;[22]
- mvi a,0 ; Turn off terminal mode
- call term
- ENDIF;[22] bbc
-
- IF px8 ;[29]
- call rsclose
- ENDIF ;px8 [29]
-
- IF hp125 ;[MF]
- lxi b,74ffh ;Set subfunction code to
- call bdos ;Reset Data Comm 1 for 7-bit data
- lhld readin+1 ;Get original rdr routine address
- shld jbuf+3 ;and store in jump vector
- lxi d,jbuf ;Point to jump vector
- lxi b,7effh ;Set subfunction code to
- call bdos ;Put original rdr routine back in bios
- ;dispatch table
- lxi d,mapoff ;Point to escape sequences to
- call prtstr ;Turn off Data Comm 1/2 mappings
- ENDIF ;hp125 [MF]
-
- ret
-
- ;
- ; system-dependent processing for start of CONNECT command
- ;
- syscon:
- IF robin OR trs80 OR cpt85xx ;For Robin/TRS80/CPT-85xx, add some more info
- lxi d,conmsg ; about obscure key combinations
- call prtstr
- ENDIF;robin OR trs80 OR cpt85xx
-
- IF osbrn1 ;*** This is Software dependent ***
- lhld 1 ;Modify back-arrow code to DELETE
- mvi l,0 ;Get BIOS-start address
- lxi d,85H ;Adress for key-code = XX85H
- dad d
- mov e,m ;Get it in DE
- inx h
- mov d,m
- xchg ;Memory pointer to HL
- mvi m,del ;modify the code
- ENDIF;osbrn1
- ret
-
- conmsg: ; Messages printed when entering transparent (CONNECT) mode:
- IF robin ; for Robin, control-S key is hidden
- db ' (Type Left Arrow to send CTRL-S)',cr,lf,'$'
- ENDIF;robin
- IF trs80 ; for TRS-80, the preferred escape key is hidden
- db ' (Control-_ is the Down-Arrow key on the TRS-80 keyboard)'
- db cr,lf,'$'
- ENDIF;trs80
- IF cpt85xx ; for CPT-85xx, some graphics map "funny" to keyboard in CP/M
- db ' (Use CODE + SHIFT + 1/2 key to generate a Control-\)'
- db cr,lf,'$'
- ENDIF;cpt85xx
- ;
- ; syscls - system-dependent close routine
- ; called when exiting transparent session.
- ;
- syscls:
- IF osbrn1
- lhld 1 ;Modify back-arrow code to BACKSPACE
- mvi l,0 ;Get BIOS address
- lxi d,85H ;Address for key-code =XX85H
- dad d
- mov e,m ;Get it in DE
- inx h
- mov d,m
- xchg ;Address to HL
- mvi m,bs ;Modify code
- ENDIF;osbrn1
- ret
- ;
- ; sysinh - help for system-dependent special functions.
- ; called in response to <escape>?, after listing all the
- ; system-independent escape sequences.
- ;
- sysinh:
- IF robin OR dmII OR cpt85xx OR lobo
- lxi d,inhlps ; we got options...
- call prtstr ; print them.
- ENDIF;robin OR dmII OR cpt85xx OR lobo
-
- IF bbc OR rm380z ; some more
- lxi d,inhlps ; we got options...
- call prtstr ; print them.
- ENDIF;[22] bbc OR rm380z
-
- IF px8 OR access OR mmate OR disc ;and more...
- lxi d,inhlps ; we got options...
- call prtstr ; print them.
- ENDIF ;px8 OR access OR mmate OR disc
-
- ret
-
-
- ;additional, system-dependent help for transparent mode
- ; (two-character escape sequences)
- inhlps:
-
- IF robin OR dmII OR cpt85xx OR lobo
- db cr,lf,'B Transmit a BREAK'
- ENDIF;robin OR dmII OR cpt85xx OR lobo
-
- IF bbc OR rm380z
- db cr,lf,'B Transmit a BREAK'
- ENDIF;bbc OR rm380z
-
- IF px8 OR access OR mmate
- db cr,lf,'B Transmit a BREAK'
- ENDIF ;px8 OR access OR mmate
-
- IF disc ;[29] [32]
- db cr,lf,'B Transmit a 300ms BREAK'
- db cr,lf,'L Transmit a 5 second BREAK'
- ENDIF;disc [29]
-
- IF lobo
- db cr,lf,'D Drop the line'
- ENDIF;lobo
-
- db '$' ;[hh] table terminator
-
- ;
- ; sysint - system dependent special functions
- ; called when transparent escape character has been typed;
- ; the second character of the sequence is in A (and in B).
- ; returns:
- ; non-skip: sequence has been processed
- ; skip: sequence was not recognized
-
- sysint: ani 137O ; convert lower case to upper, for testing...
-
- IF robin OR dmII OR cpt85xx OR lobo
- cpi 'B' ; send break?
- jz sendbr ; yes, go do it. return nonskip when through.
- ENDIF;robin OR dmII OR cpt85xx OR lobo
-
- IF bbc OR rm380z ; [22] [25] ... some more
- cpi 'B' ; send break?
- jz sendbr ; yes, go do it. return nonskip when through.
- ENDIF; bbc OR rm380z
-
- IF px8 OR access OR mmate ;[28] [29] and anothers
- cpi 'B' ; send break?
- jz sendbr ; yes, go do it. return nonskip when through.
- ENDIF ; px8 OR access OR mmate [28] [29]
-
- IF lobo ;[hh]
- cpi 'D' ;[hh] disconnect?
- jz discon ;[hh] yes, go do it. nonskip return when done.
- ENDIF ;lobo
-
- IF disc ;[29]
- cpi 'B' ;Send short break?
- jz sendbr
- cpi 'L' ;Send long break?
- jz sendlbr
- ENDIF;disc [29]
-
- jmp rskp ; take skip return - command not recognized.
-
-
- ;
- IF robin ;Definitions & code to send a BREAK (ungenerically, no other way).
-
- comctl equ 59h ;VT180 communications port
- crtctl equ 41h ;VT180 crt port
-
- ;VT180 serial port command bits
-
- txe equ 1 ;transmit enable
- dtr equ 2 ;dtr on
- rxe equ 4 ;rx enable
- sndbrk equ 8
- rerr equ 10h ;reset error
- rts equ 20h ;RTS on
- reset equ 40h ;port reset
-
- ;Send a break to the communications port.
- ;
-
- sendbr: lxi h,38500 ;250 ms(?)
- lda prtadr ;Get address of selected port
- mov c,a ;Into C
- mvi a,sndbrk+dtr
- ; OUT C,A ;Want to send to port addressed by C
- db 0EDH,079H ;Op code for above instruction
- sndbr1: dcx h ;timing loop...
- mov a,l
- ora h
- jnz sndbr1 ;...until over
- lda prtadr ;Get the address for the port
- mov c,a ;Into C
- mvi a,txe+dtr+rxe+rerr+rts ;enable tr/rc, dtr, reset error
- ; out c,a ;Z-80 only instruction
- db 0EDH,079H ;Op code for above instruction
- out contst ;reset ports
- ret
- ENDIF;robin
- ;
- IF dmII ;[jd] this added to send break on DECmate
-
- ; DECmate command codes for 6120 I/O processor
- oboff equ 3fh ; offset of outbyt routine for 6120
- prtctl equ 02h ; port control
- brdat equ 06h ; data to tell 6120 to send a break
- brdur equ 30 ; duration, 30 = 300 ms.
-
- sendbr: lxi b,(brdat * 100h) + prtctl ; c/prtctl, b/brdat
- call outbyt
- lxi b,brdur*100h ; b/duration, c/0
- ; fall through into outbyt
-
- outbyt: lhld 1 ; get warm boot address
- lxi d,oboff ; offset of outbyt routine
- dad d ; compute address
- pchl ; branch there (a callret)
-
- ENDIF;dmII
- ;
- IF access OR mmate ;[cjc] send break on Kaypro [29]
- ; Officially, a "break" is 300 milliseconds of "space" (idle line is
- ; "mark"). (or maybe 200 milliseconds; I forget.) The timing isn't
- ; usually that critical, but we'll make an attempt, at least. Sending
- ; too long a break can cause some modems to hang up.
-
- sendbr:
- ; First, make sure the transmitter is really empty. (The SIO sets
- ; "transmitter buffer empty" when it can accept another character;
- ; the previous character is still being shifted onto the line.
- ; Another status bit, "all done", is set to indicate that the
- ; transmitter is really idle.
- sndbr1: mvi a,1 ; select Read Register 1
- out mnprts
- in mnprts ; read the contents
- ani 1 ; test "all done" flag
- jz sndbr1 ; loop until it's nonzero.
- ;
- ; Next, set the "send break" bit to start the transmitter spacing.
- mvi a,5 ; select Write Register 5
- out mnprts
- mvi a,0FAH ; Tx enable, 8 bit Tx character, Send Break,
- out mnprts ; DTR and RTS on.
- ;
- ; Now, delay for 30 hundredths of a second
- mvi a,30 ; delay count
- call delay
- ;
- ; Time's up. Put transmitter back in normal state (data byte is the
- ; same as the one in siotbl: for Write Register 5) and return.
- mvi a,5 ; select Write Register 5
- out mnprts
- mvi a,0EAH ; Tx enable, 8 bit Tx character,
- out mnprts ; DTR and RTS on.
- ret ; done.
- ENDIF;access OR mmate [29]
-
- IF lobo ;[hh] This routine sends a break tone or disconnects a modem
- ; (those that respond to it) by setting the DTR line low
- ; for 300 ms.
- ;
- sendbr: mvi a,05H ;[hh] write register 5
- call outctl ;[hh] send it to control port
- mvi a,0FAH ;[hh] value to send break tone
- jmp sndbr1 ;[hh]
- ;
- discon: mvi a,05H ;[hh] write register 5
- call outctl ;[hh] send it to the control port
- mvi a,06AH ;[hh] DTR off and break tone on
- sndbr1: call outctl ;[hh] send to control port
- mvi a,30 ;[hh] delay count for 300 ms.
- call delay ;[hh] wait a while...
- mvi a,05H ;[hh] write register 5
- call outctl ;[hh] get it's attention
- mvi a,0EAH ;[hh] normal 8 bits, DTR on, RTS on, etc.
- call outctl ;[hh] restore SIO
- ret
- ;
- outctl: sta mnprts ;[hh]
- ret
- ENDIF ;lobo
- ;
- IF cpt85xx OR rm380z ;[lmj] [22] [25]
- sendbr:
- ;
- ; Ensure that the transmitter has finished sending buffered chars
- sndbr1: in mnprts ; get UART status
- ani TxEmpty ; everything sent?
- jz sndbr1 ; no, wait a bit more
- ;
- ; Begin sending a break by setting bit in UART command register
- mvi a,3Fh ; Set TxEna, DTR, RxEna, SBreak, ErrRst, RTS
- out mnprts
- ;
- ; Wait for 250 milliseconds (using hundredths second delay routine)
- mvi a,25
- call delay
- ;
- ; Resume normal operation by clearing the SendBreak command bit
- mvi a,37h ;Set TxEna, DTR, RxEna, ErrRst, RTS
- out mnprts
- ;
- ret ;done
- ENDIF;cpt85xx OR rm380z
-
- IF px8 ; [29]
- sendbr: mvi a, 3fh ; set break bit
- out mnprts
- mvi a, 25
- call delay ; wait 250 msec
- mvi a, 37h ; clear break bit
- out mnprts
- ret
- ENDIF ; px8 [29]
-
- ;
- IF bbc ;[22]
- sendbr:
- ;
- ; Ensure that the transmitter has finished sending buffered chars
- sndbr1: mvi a,96h ; get ACIA status
- mvi l,8
- call osbyte ; *FX150,8
- mov a,h
- ani 2 ; everything sent?
- jz sndbr1 ; no, wait a bit more
- ;
- ; Disable centisecond clock (system VIA) which interferes with break
- lxi h,0FE4Eh ; system VIA interrupt enable register
- mvi a,40H ; disable timer 1
- call wrtiom ; write to I/O processor memory
- ;
- ; Begin sending a break by setting bit in ACIA control register
- mvi a,9Ch
- lxi h,9F60h ; Set Rxint, Txint, Break, RTS
- call osbyte ; *FX 156,96,159
- ;
- ; Wait for 250 milliseconds (using hundredths second delay routine)
- mvi a,25
- call delay
- ;
- ; Resume normal operation by returning old control byte
- mvi a,9Ch
- mvi h,0 ;Set TxEna, DTR, RxEna, ErrRst, RTS
- call osbyte ; *FX 156,oldvalue,0
- ;
- ; Enable centisecond clock (system VIA)
- lxi h,0FE4Eh ; system VIA interrupt enable register
- mvi a,0C0H ; enable timer 1
- call wrtiom ; write to I/O processor memory
- ;
- ret ;done
- ;
- ; Routine to write byte in A to I/O processor memory address
- ; given by HL
- wrtiom:
- shld parblk ; store address to parameter block
- sta parblk+4 ; store data
- lxi h,parblk ; load hl with address of param block
- mvi a,6 ; write I/O processor memory
- call osword ; go do it
- ret
- ;
- parblk: DS 5 ; reserve space for parameter block
- ENDIF;bbc [22]
- ;
- IF disc ;[29]
- ; This is almost an exact copy of the bbI sendbr routine.
- ; Modifications to include a long break have been made.
- ;
- ; Officially, a "break" is 300 milliseconds of "space" (idle line is
- ; "mark"). (or maybe 200 milliseconds; I forget.) The timing isn't
- ; usually that critical, but we'll make an attempt, at least. Sending
- ; too long a break can cause some modems to hang up.
-
- sendlbr:
- push d ;save d, this may not be necessary, but safe
- mvi d,17 ;do short break 17 times (approx. 5 sec.)
- jmp sndbr1
- sendbr:
- push d
- mvi d,1 ;On short break, do only once
- ; First, make sure the transmitter is really empty. (The SIO sets
- ; "transmitter buffer empty" when it can accept another character;
- ; the previous character is still being shifted onto the line.
- ; Another status bit, "all done", is set to indicate that the
- ; transmitter is really idle.
- sndbr1: mvi a,1 ; select Read Register 1
- out mnprts
- in mnprts ; read the contents
- ani 1 ; test "all done" flag
- jz sndbr1 ; loop until it's nonzero.
- ;
- ; Next, set the "send break" bit to start the transmitter spacing.
- mvi a,5 ; select Write Register 5
- out mnprts
- mvi a,0FAH ; Tx enable, 8 bit Tx character, Send Break,
- out mnprts ; DTR and RTS on.
- ;
- ; Now, delay for 30*d hundredths of a second
- sendbr2:
- mvi a,30 ; delay count
- call delay
- ; The following has been added to allow doing .03 delay d times
- dcr d ; decrement # of times to do loop
- jnz sendbr2 ; if not done, do again
- pop d ; reload d
- ;
- ; Time's up. Put transmitter back in normal state (data byte is the
- ; same as the one in siotbl: for Write Register 5) and return.
- mvi a,5 ; select Write Register 5
- out mnprts
- mvi a,0EAH ; Tx enable, 8 bit Tx character,
- out mnprts ; DTR and RTS on.
- ret ; done.
- ENDIF ;disc [29]
-
-
- ;
- ; sysflt - system-dependent filter
- ; called with character in E.
- ; if this character should not be printed, return with A = zero.
- ; preserves bc, de, hl.
- ; note: <xon>,<xoff>,<del>, and <nul> are always discarded.
- sysflt:
- mov a,e ; get character for testing
- IF mikko
- cpi 'O'-100O ;Control-O's lock keyboard
- rnz ; if not control-O, it's ok.
- xra a ; don't allow control-O out.
- ENDIF;mikko
-
- ret
-
- ; mdmflt - modem filter [30]
- ; called with character to be sent to printer in E
- ; with parity set as appropriate.
- ; return with accumulator = 0 do do nothing,
- ; <> 0 to send char in E.
- mdmflt:
- mov a,e ;[30] get character to test
- ret
-
-
-
- ; prtflt - printer filter [30]
- ; called with character to be sent to printer in E
- ; returns with a = 0 to do nothing
- ; a <> 0 to print it.
- ;
- ; this routine for those printer that automatically insert
- ; a lf on cr, or cr for lf. Should this be shifted to
- ; the system indep. stuff, in say 4.06?
- prtflt:
- mov a,e ; [30] get character to test
- ret
-
-
- ;
- ; system-dependent processing for BYE command.
- ; for lobo, hang up the phone.
- sysbye:
- IF lobo ;[hh]
- call discon ;[hh] force modem to hang up
- ENDIF;lobo
- ret
-
- IF lasm
- LINK CPXSY2.ASM ; If m80 then this ignored
- ENDIF ; lasm
-